package com.arpa.ntocc.common.common.util.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;

import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * excel监听类
 * @Author liuyj
 * @Date 2019-12-30 22:26:38
 */
public class ExcelListener<T> extends AnalysisEventListener {

    List<T> list = new ArrayList<>();

    /**
     * 每解析一行会回调invoke()方法
     * @param data
     * @param context
     */
    @Override
    public void invoke(Object data, AnalysisContext context) {
        list.add((T)data);
    }

    /**
     * 解析完所有数据后会调用该方法
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }

    /**
     * 在转换异常 获取其他异常下会调用本接口。抛出异常则停止读取。如果这里不抛出异常则 继续读取下一行。
     *
     * @param exception
     * @param context
     * @throws Exception
     */
    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        // 如果是某一个单元格的转换异常 能获取到具体行号
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
            String err = MessageFormat.format("数据部分，第{0}行，第{1}列数据解析异常：{2}",excelDataConvertException.getRowIndex(), excelDataConvertException.getColumnIndex(),excelDataConvertException.getCause());
            throw new Exception(err);
        }
    }

    /**
     * 获取解析的列表数据
     * @return
     */
    public List<T> getList(){
        return this.list;
    }
}
